package indi.wrenn.studentsystem.frame;

import indi.wrenn.studentsystem.dao.ManageHelper;
import indi.wrenn.studentsystem.model.StudentModel;
import indi.wrenn.studentsystem.util.WindowUtil;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashMap;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * 修改成绩对话框
 * 用于修改指定学生的各科成绩
 */
public class UpdateScoreFrame extends JDialog{
	private ManageHelper helper;                    // 数据库操作辅助类
	private StudentModel sm;                        // 学生数据模型
	private Vector<String> courses;                 // 课程列表
	private JDialog jd;                             // 当前窗口引用
	private JButton update_button;                  // "修改"按钮
	private JButton cancel_button;                  // "取消"按钮
	private HashMap<String, JTextField> jtextFieldHashMap; // 课程对应的文本框集合
	private HashMap<String, String> scores;         // 学生所有成绩

	/**
	 * 构造函数
	 * @param owner 父窗口
	 * @param title 对话框标题
	 * @param modal 是否为模态对话框
	 * @param sm 学生数据模型
	 * @param rowNum 选中的行号
	 */
	public UpdateScoreFrame(JDialog owner, String title, boolean modal, StudentModel sm, int rowNum){
		super(owner, title, modal);
		this.jd = this;
		this.setLayout(null);  // 设置为绝对布局
		helper = new ManageHelper();
		this.sm = sm;
		jtextFieldHashMap = new HashMap<String, JTextField>();

		// 获取该学生的所有课程
		courses = helper.getCourse(
				helper.getAllMajor().get(sm.getValueAt(rowNum, 6)),  // 专业ID
				sm.getValueAt(rowNum, 3).toString()                   // 年级
		);

		int vgap = 0;  // 垂直间距

		// 获取学生当前所有成绩
		scores = helper.getStudentScore(sm.getValueAt(rowNum, 0).toString());  // 学号

		// 检查学生是否有成绩记录
		if(scores.isEmpty()){
			JOptionPane.showMessageDialog(jd, "该同学没有成绩", "", JOptionPane.WARNING_MESSAGE);
			jd.dispose();
			return;
		}

		// 动态创建课程成绩输入框
		for(int i = 0; i < courses.size(); i++){
			JLabel jLabel = new JLabel(courses.get(i) + ":");
			jLabel.setBounds(78, 48 + vgap, 120, 20);

			JTextField field = new JTextField();
			field.setText(scores.get(courses.get(i)));  // 设置当前成绩
			field.setBounds(206, 48 + vgap, 150, 20);

			jtextFieldHashMap.put(courses.get(i), field);  // 添加到文本框集合
			this.add(jLabel);
			this.add(field);
			vgap += 30;  // 每个输入框间隔30像素
		}

		// 初始化修改按钮
		update_button = new JButton("修改");
		update_button.setBounds(120, 48 + vgap + 5, 60, 20);

		// 为修改按钮添加事件监听器
		update_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 验证所有成绩输入
				for(int i = 0; i < courses.size(); i++){
					JTextField field = jtextFieldHashMap.get(courses.get(i));
					String score = field.getText().trim();

					// 检查成绩是否为空
					if(score.equals("")){
						JOptionPane.showMessageDialog(jd, "成绩不能为空", "", JOptionPane.WARNING_MESSAGE);
						return;
					}

					// 检查成绩范围是否合法 (0-100)
					try {
						double scoreValue = Double.parseDouble(score);
						if(scoreValue < 0 || scoreValue > 100){
							JOptionPane.showMessageDialog(jd, "请输入0~100之间的成绩", "", JOptionPane.WARNING_MESSAGE);
							return;
						}
					} catch (NumberFormatException ex) {
						JOptionPane.showMessageDialog(jd, "请输入有效的数字成绩", "", JOptionPane.WARNING_MESSAGE);
						return;
					}
				}

				// 更新所有课程成绩
				int i;
				for(i = 0; i < courses.size(); i++){
					JTextField field = jtextFieldHashMap.get(courses.get(i));
					String score = field.getText().trim();

					// 执行成绩更新操作
					boolean success = helper.updateStudentScore(
							sm.getValueAt(rowNum, 0).toString(),  // 学号
							courses.get(i),                       // 课程名称
							score                                 // 新成绩
					);

					if(!success){
						break;  // 如果更新失败，跳出循环
					}
				}

				// 检查更新结果
				if(i < courses.size()){
					// 部分或全部更新失败
					JOptionPane.showMessageDialog(jd, "修改失败", "", JOptionPane.WARNING_MESSAGE);
					return;
				} else {
					// 全部更新成功
					JOptionPane.showMessageDialog(jd, "修改成功", "", JOptionPane.WARNING_MESSAGE);
					jd.dispose();  // 关闭对话框
					return;
				}
			}
		});
		this.add(update_button);

		// 初始化取消按钮
		cancel_button = new JButton("取消");
		cancel_button.setBounds(280, 48 + vgap + 5, 60, 20);
		cancel_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				jd.dispose();  // 关闭对话框
			}
		});
		this.add(cancel_button);

		// 动态设置窗口大小
		this.setSize(450, 48 + vgap + 78);
		WindowUtil.setFrameCenter(this);  // 窗口居中显示
		this.setVisible(true);           // 显示窗口
	}
}